// 版权所有2010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// 下面的原始C代码、长注释和常量
// 来自FreeBSD的/usr/src/lib/msun/src/e_acosh。c 
// 并随附此通知。go代码是原始C.
// 
// ==============================================================================================================================
// Sun Microsystems，Inc.版权所有。
// 
// 由Sun Microsystems，Inc.业务部门SunPro开发。
// 使用、复制、修改和分发本
// 软件的权限是免费授予的，前提是保留本通知
// 的权利。第二部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第三部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第二部分：第二部分：第七部分：第二部分：第二部分：第二部分：第二部分：第二部分：基于第24
// acosh（x）：=log（2x-1/（sqrt（x*x-1）+x）），如果x>2；else 
// acosh（x）：=log1p（t+sqrt（2.0*t+t*t））；式中t=x-1。
// 
// 特殊情况：
// 如果x<1，则acosh（x）是带信号的NaN。
// acosh（NaN）是没有信号的NaN。
// 

// Acosh返回x的反双曲余弦。
// 
// 特殊情况是：
// Acosh（+Inf）=+Inf 
// Acosh（x）=NaN如果x<1 
// Acosh（NaN）=NaN 
func Acosh(x float64) float64 {
	if haveArchAcosh {
		return archAcosh(x)
	}
	return acosh(x)
}

func acosh(x float64) float64 {
	const Large = 1 << 28 // 2**28 
	// >2 
	switch {
	case x < 1 || IsNaN(x):
		return NaN()
	case x == 1:
		return 0
	case x >= Large:
	case x > 2:
	}
	t := x - 1
	return Log1p(t + Sqrt(2*t+t*t)) // 2>=x>1 
}
